<?php

App::uses('AppController', 'Controller');
App::uses('CakeEmail', 'Network/Email');

class RecorridosRealizadosController extends AppController {
    /**
     * 				CONTROLLER DATA MEMBERS
     */

    /**
     * Nombre del controlador
     *
     * Nombre del controlador
     *
     * @var string
     */
    public $name = "RecorridosRealizados";

    /**
     * Modelos que utiliza
     *
     * Los modelos que usa el controller. Por defecto
     * cake usa el singular basado en el nombre del modelo,
     * pero por asuntos del idioma siempre se ingresa el modelo
     * para evitar posibles problemas.
     *
     * @var array(string)
     */
    public $uses = array('RecorridoRealizado', 'Reserva', 'Usuario');

    /**
     * Componentes que utiliza
     *
     * Componentes que utiliza el controlador
     *
     * @var array(string)
     */
    public $components = array("Session");

    /**
     * 				CONTROLLER CALLBACKS METHODS
     */

    // public function beforeFilter() {
    // }
    // public function afterFilter() {
    // }
    // public function beforeRender() {
    // }

    /**
     * 				CONTROLLER METHODS (ACTIONS)
     */

    /**
     * Action por defecto para las recorridos
     *
     * Este es el metodo base de los recorridos, en este metodo
     * se buscan los recorridos almacenadas en el sistema y se
     * devuelven a la vista para que el usuario pueda realizar
     * acciones sobre ellos
     *
     * @return void
     */
    public function index() {

    }

    public function retrieve_all() {
        if ($this->request->is('ajax')) {
            $data = $this->request->data;

            foreach ($data['order'] as $i => $order) {
                $data['order'][$i] = array(
                    'column' => $data['columns'][$data['order'][$i]['column']]['data'],
                    'direction' => strtoupper($data['order'][$i]['dir'])
                );
            }

            $filter = array();
            foreach ($data['columns'] as $i => $column) {
                if ($column['searchable'] === "true" && !empty($column['search']['value'])) {
                    $filter[] = array(
                        'column' => $column['name'],
                        'value' => $column['search']['value']
                    );
                }
            }

            $models = $this->RecorridoRealizado->findAll($start = $data['start'], $length = $data['length'], $order = $data['order'], $filter);
            $totalWithFilter = $this->RecorridoRealizado->findCountAll($filter);
            $total = $this->RecorridoRealizado->findCountAll();

            $this->set(array(
                'draw' => $data['draw'],
                'results' => $models,
                'recordsTotal' => $total,
                'recordsFiltered' => $totalWithFilter
            ));
            $this->set('_serialize', array('results', 'recordsTotal', 'draw', 'recordsFiltered'));
        } else {
            $this->autoRender = false;
        }
    }

    /**
     * Consultar la información de un recorrido especifico
     *
     * En este metodo se busca el recorrido según el parametro de
     * entrada $id, si dicho parametro es nulo o si no se encuentra
     * un recorrido con ese identificador asociado se devuelve un error.
     * Por otro lado, si se encuentra el recorrido, se devuelve su
     * información a la vista para que sea procesada.
     *
     *
     * @param int $id identifiacador de el recorrido que se va a buscar.
     * @return void
     */
    public function ver($id = null) {
        if (!$id) {
            throw new NotFoundException('Recorrido realizado inválido');
        }

        $recorrido_realizado = $this->RecorridoRealizado->findByid_recorrido_realizado($id);
        if (!$recorrido_realizado) {
            $this->Session->setFlash('Recorrido realizado inválido');
            throw new NotFoundException('Recorrido realizado inválido');
        }
        $this->set('recorrido_realizado', $recorrido_realizado);
    }

    /**
     * Adicionar un nuevo recorrido
     *
     * Encargado de enviar a la vista todas las paradas activas y,
     * cuando haya un request por post, agregar una recorrido nueva
     *
     * @return void
     */
    public function agregar() {
        $this->set(array(
            "buses" => $this->RecorridoRealizado->Bus->find('all', array(
                'conditions' => array('Bus.estado_bus' => 'activo')
            )),
            "conductores" => $this->RecorridoRealizado->Conductor->find('all', array(
                'conditions' => array('Conductor.estado_conductor' => 'activo')
            )),
            "recorridos" => $this->RecorridoRealizado->Recorrido->find('all', array(
                'conditions' => array('Recorrido.estado_recorrido' => 'activo')
            )),
                )
        );

        if ($this->request->is('post')) {
            $this->RecorridoRealizado->create();
            if ($this->RecorridoRealizado->save($this->request->data)) {
                $this->Session->setFlash('Recorrido realizado guardado exitosamente');
                $this->redirect(array('action' => 'index'));
            } else {
                $this->Session->setFlash('Recorrido realizado no guardado');
            }
        }
    }

    /**
     * Editar una recorrido previamente almacenada
     *
     * Se verifica que el parametro $id no sea nulo y luego se busca la
     * recorrido a editar, en caso de tener el parametro vacio o de no
     * encontrar la recorrido se lanza una exception con el mensaje de
     * error correspondiente. Posteriormente se verifica si se están
     * almacenando los nuevos datos de la recorrido, de ser asi se guardan
     * estos nuevos datos y el metodo termina. De lo contrario se asume
     * que se esta haciendo un get de la vista de editar y por eso se
     * devuelven los datos de la recorrido para que sean presentados en la
     * vista de edición.
     *
     * @param int $id identifiacador de la recorrido que se va a editar.
     * @return void
     */
    public function editar($id = null) {
        if (!$id) {
            throw new NotFoundException('Recorrido realizado inválido');
        }

        $recorrido_realizado = $this->RecorridoRealizado->findByid_recorrido_realizado($id);
        if (!$recorrido_realizado) {
            throw new NotFoundException('Recorrido realizado inválido');
        }

        $buses = $this->RecorridoRealizado->Bus->find('all', array(
            'conditions' => array('Bus.estado_bus' => 'activo')
        ));
        $conductores = $this->RecorridoRealizado->Conductor->find('all', array(
            'conditions' => array('Conductor.estado_conductor' => 'activo')
        ));
        $recorridos = $this->RecorridoRealizado->Recorrido->find('all', array(
            'conditions' => array('Recorrido.estado_recorrido' => 'activo')
        ));

        $this->set(array(
            "buses" => $buses,
            "conductores" => $conductores,
            "recorridos" => $recorridos
                )
        );

        if ($this->request->is('post') || $this->request->is('put')) {
            $this->request->data['RecorridoRealizado']['id_recorrido_realizado'] = $id;
            if ($this->RecorridoRealizado->save($this->request->data)) {
                $reservas = $this->Reserva->find('all', array(
                    'conditions' => array('Reserva.id_recorrido_realizado' => $id)
                ));
                if (count($reservas) > 0) {
                    foreach ($buses as $bus) {
                        if ($bus['Bus']['id_bus'] == $this->request->data['Bus']['id_bus']) {
                            $busElegido = $bus;
                        }
                    }
                    foreach ($conductores as $conductor) {
                        if ($conductor['Conductor']['id_conductor'] == $this->request->data['Conductor']['id_conductor']) {
                            $conductorElegido = $conductor;
                        }
                    }
                    $correos = array();
                    foreach ($reservas as $res) {
                        $usuario = $res['Reserva']['id_usuario'];
                        $usuarioObjeto = $this->Usuario->find('all', array(
                            'conditions' => array('Usuario.identificacion_usuario' => $usuario)
                        ));
                        if (!empty($usuarioObjeto)) {
                            $correo = $usuarioObjeto[0]['Usuario']['correo'];
                        } else {
                            $correo = null;
                        }

                        if (!empty($correo)) {
                            $correos[] = $correo;
                        }
                    }
                    if (count($correos) > 0) {
                        $Email = new CakeEmail('default');
                        $Email->template("rr_notification", "email_miBus")->emailFormat('both');
                        $Email->bcc($correos);
                        $Email->subject("Su Recorrido en miBus ha sido modificado");
                        $Email->viewVars(array(
                            'placa' => $busElegido['Bus']['placa'],
                            'capacidad' => $busElegido['Bus']['capacidad'],
                            'empresa' => $busElegido['Bus']['empresa'],
                            'driverName' => $conductorElegido['Conductor']['nombre_conductor'],
                            'reservedSpots' => $this->request->data['RecorridoRealizado']['puestos_reservados'],
                            'departure' => $recorrido_realizado['RecorridoRealizado']['fecha_salida'],
                            'state' => $this->request->data['RecorridoRealizado']['estado_recorrido_realizado']
                        ));
                        $Email->send("");
                    }
                }
                $this->Session->setFlash('Recorrido realizado actualizado exitosamente');
                $this->redirect(array('action' => 'index'));
            } else {
                $this->Session->setFlash('Recorrido realizado no actualizado');
            }
        }

        if (!$this->request->data) {
            $this->request->data = $recorrido_realizado;
        }
    }

    /**
     * Borra una recorrido de la base de datos
     *
     * Se verifica que el request no sea un get para
     * minimzar la probabilidad de errores. Luego se borra la recorrido
     * indicada.
     *
     * @param int $id identifiacador de la recorrido que se va a editar.
     * @return void
     */
    public function borrar($id) {
        if ($this->RecorridoRealizado->delete($id)) {
            $this->Session->setFlash('Recorrido realizado con id: ' . $id . ' ha sido borrada exitosamente');
        }

        $this->redirect(array('action' => 'index'));
    }

}
